package main

import (
	"fmt"
	"math"
)

const (
	width  = 31 // 画布宽度（奇数确保对称）
	height = 31 // 画布高度
)

func main() {
	// 初始化画布（二维字节数组）
	canvas := make([][]byte, height)
	for i := range canvas {
		canvas[i] = make([]byte, width)
		for j := range canvas[i] {
			canvas[i][j] = ' ' // 用空格填充画布
		}
	}

	center := width / 2              // 中心点坐标
	radius := float64(center) * 0.85 // 五角星半径

	// 计算五角星五个顶点坐标
	var points [5][2]int
	for i := 0; i < 5; i++ {
		angle := 2*math.Pi*float64(i)/5 - math.Pi/2 // 计算角度偏移
		x := center + int(radius*math.Cos(angle))   // 笛卡尔坐标转换
		y := center + int(radius*math.Sin(angle))
		points[i] = [2]int{x, y}
	}

	// 连接顶点形成五角星
	for i := 0; i < 5; i++ {
		next := (i + 2) % 5
		drawLine(canvas, points[i][0], points[i][1], points[next][0], points[next][1])
	}

	// 打印结果
	printCanvas(canvas)
}

// Bresenham直线算法实现
func drawLine(canvas [][]byte, x0, y0, x1, y1 int) {
	dx := abs(x1 - x0)
	sx := 1
	if x0 > x1 {
		sx = -1
	}

	dy := -abs(y1 - y0)
	sy := 1
	if y0 > y1 {
		sy = -1
	}

	err := dx + dy // 误差值

	for {
		// 在画布范围内绘制像素
		if x0 >= 0 && x0 < width && y0 >= 0 && y0 < height {
			canvas[y0][x0] = '*'
		}

		// 到达终点时退出循环
		if x0 == x1 && y0 == y1 {
			break
		}

		e2 := 2 * err
		// X方向误差累积
		if e2 >= dy {
			err += dy
			x0 += sx
		}
		// Y方向误差累积
		if e2 <= dx {
			err += dx
			y0 += sy
		}
	}
}

// 辅助函数：取绝对值
func abs(x int) int {
	if x < 0 {
		return -x
	}
	return x
}

// 打印画布内容
func printCanvas(canvas [][]byte) {
	for _, row := range canvas {
		fmt.Println(string(row))
	}
}
